<?php
/*Дополнительные классы. Данный модуль служит для создания классов, которые используются для передачи параметров.
Автор: Andrew Shapovalov
Созданно: 14.02.2010
Обновленно: 21.02.2010
*/

//Класс для настройки плагина jqModal
class SHAV_jqModal
{
	var $windowId = '';
	var $wndSize = array('width'=>'500px', 'height'=>'180px');
	var $wndPosition = array('top'=>'10%', 'left'=>'45%');
	var $closeImg = '/js/jqModal/img/close.gif';
	var $windowContent = '';
	var $title = 'Test Window';

	var $linkName = 'Show the window';
	var $linkId = '';
	var $linkUrl = '#';
	
	var $transparent = 30;
	var $subWindows = array();

	/*Конструктор класса.*/
	function SHAV_jqModal()
	{
	}

	/*Выводит содержимое данного обекта*/
	function drawInfo()
	{
		DrawObject($this);
	}
	
	/*Выводит ссылку и окно
	ПАРАМЕТРЫ:
		$type - Тип окна: style_dialog - одно окно, nested_modal - окно с ajax и под окном.
		$isDraw - вывести или вернуть html-код блока.
	РЕЗУЛЬТАТ:
		Создает окно.*/
	function drawModalWindow($type='style_dialog', $isDraw = false)
	{
		$divsWidth = '#'.$this->windowId.'.jqmDialog';
		$divsHeight = '#'.$this->windowId.' .jqmdBC';
		foreach($this->subWindows as $wnd)
		{
			$divsWidth .= ', #'.$wnd->windowId.'.jqmDialog';
			$divsHeight .= '#'.$this->windowId.' .jqmdBC';
		}
		
		$content .= '<style>
		'.$divsWidth.' {
			display: none;
			
			position: fixed;
			top: '.$this->wndPosition['top'].';
			left: '.$this->wndPosition['left'].';
			
			margin-left: -200px;
			width: '.$this->wndSize['width'].';
			
			overflow: hidden;
			font-family:verdana,tahoma,helvetica;
		}
		
		'.$divsHeight.' {
			background: url("/js/jqModal/img/bc.gif") repeat-x center bottom;
			padding: 7px 7px 7px;
			height: '.$this->wndSize['height'].'px;
			overflow: auto;
		}
		</style>';
		$content .= '<script type="text/javascript">';
		
		$trigger = 'trigger: \'#'.$this->linkId.'\',
		overlay: '.$this->transparent.', /* 0-100 (int) : 0 is off/transparent, 100 is opaque */
		overlayClass: \'whiteOverlay\'})
		.jqDrag(\'.jqDrag\'); /* make dialog draggable, assign handle to title */';
		
		$subModalWindow = '';
		$t = '';
		if(is_array($this->subWindows) && !empty($this->subWindows))
		{
			$i = 1;
			foreach($this->subWindows as $wnd)
			{
				$subModalWindow .= '// nested dialog_'.$i.'
				$(\'#'.$wnd->windowId.'\').jqm({modal: true, overlay: '.$wnd->transparent.', trigger: false});';
				$i++;
			}
			$t = 'var t = $(\'#'.$this->windowId.' div.jqmdMSG\');';
			$trigger = 'trigger: \'a.'.$this->linkId.'\',
							ajax: \'@href\',
							target: t,
							modal: true, /* FORCE FOCUS */
							onHide: function(h) {
				t.html(\'Please Wait...\');  // Clear Content HTML on Hide.
				h.o.remove(); // remove overlay
				h.w.fadeOut(888); // hide window
			},
				  overlay: 0});';
		}
		
		
		$content .= '$().ready(function() {
				'.$t.'
				$(\'#'.$this->windowId.'\').jqm({
					'.$trigger.'
					'.$subModalWindow.'
					
					// Close Button Highlighting. IE doesn\'t support :hover. Surprise?
					$(\'input.jqmdX\')
					.hover(
					function(){ $(this).addClass(\'jqmdXFocus\'); },
						   function(){ $(this).removeClass(\'jqmdXFocus\'); })
						   .focus(
						   function(){ this.hideFocus=true; $(this).addClass(\'jqmdXFocus\'); })
		.blur(
		function(){ $(this).removeClass(\'jqmdXFocus\'); });
		
		});';
		$content .= '</script>';


		switch($type)
		{
			case 'style_dialog':
				$content .= '<a href="'.$this->linkUrl.'" id="'.$this->linkId.'">'.$this->linkName.'</a>';
				$content .= '<div id="'.$this->windowId.'" class="jqmDialog">';
				$content .= '<div class="jqmdTL"><div class="jqmdTR"><div class="jqmdTC jqDrag">'.$this->title.'</div></div></div>';
				$content .= '<div class="jqmdBL"><div class="jqmdBR"><div class="jqmdBC">';
				$content .= '<div class="jqmdMSG">'.$this->windowContent.'</div>';
				$content .= '</div></div></div>';
				$content .= '<input type="image" src="'.$this->closeImg.'" class="jqmdX jqmClose" />';
				$content .= '</div>';
				break;
			case 'nested_modal':
				$content .= '<a href="'.$this->linkUrl.'" class="'.$this->linkId.'">'.$this->linkName.'</a>
				<div id="'.$this->windowId.'" class="jqmDialog jqmdWide">
					<div class="jqmdTL">
						<div class="jqmdTR">
							<div class="jqmdTC">'.$this->title.'</div>
						</div>
					</div>
					<div class="jqmdBL">
						<div class="jqmdBR">
							<div class="jqmdBC">
								<div class="jqmdMSG"><p>Please wait... <img src="js/jqModal/img/busy.gif" alt="loading" /></p></div>
							</div>
						</div>
					</div>
					<input type="image" src="'.$this->closeImg.'" class="jqmdX jqmClose" />
				</div>';

				foreach($this->subWindows as $wnd)
				{
					$content .= '<!-- nested dialog -->';
					$content .= '<div id="'.$wnd->windowId.'" class="jqmDialog jqmdAbove">';
					$content .= '	<div class="jqmdTL">
					<div class="jqmdTR">
					<div class="jqmdTC">'.$wnd->title.'</div>
					</div>
					</div>
					<div class="jqmdBL">
					<div class="jqmdBR">
					<div class="jqmdBC jqmdTall">
					<div class="jqmdMSG">'.$wnd->windowContent.'</div>
					</div>
					</div>
					</div>';
					$content .= '	<input type="image" src="'.$wnd->closeImg.'" class="jqmdX jqmClose" />';
					$content .= '</div>';
				}
				break;
		}

		if($isDraw == true)
			echo $content;
		else
			return $content;
	}
}

/*Класс для создания диограм и графиков*/
class SHAV_jqPlot
{
	var $title = 'График';		//Заголовок графика
	var $dataValues = array(array(2, 10, 20));			//Значение на оси X
	var $rowsTitle = array('row 1', 'row2', 'Row 3');	//значение на оси Y
	var $maxValue = 20;			//Максимальное значение для оси X
	var $minValue = 0;			//Минимальное значение для оси X
	var $korrection = 10;
	var $idDiagram = 'chart';	//Идентификатор компонента для вывода
	var $legendPos = 'se';		//Позиция легенды (принцип компаца)
	var $labelLegends = array('line 1');	//Легенда для графиков
	var $pointLabels = array('fourteen', 'thirty two', 'fourty one', 'fourty four', 'fourty');	//Список подписей над вершинами
	var $numberTicks = 5;	//шаг
	var $styleDiv = 'margin-top:20px; margin-left:50px; width:900px; height:400px;';	//Стиль элемента для вывода в div
	var $content = '';			//Содержимое для вывода 
	var $marginRow = 40;		//
	var $paddingRow = 6;		//
	var $isPracent = false;		//Расчитывать пройентное соотношение

	/*Конструктор класса*/
	function SHAV_jqPlot()
	{
	}

	/*Создать диограму из таблиц базы данны использюя SQL-запрос
	ПАРАМЕТРЫ:
		$sql - запрос для базы на получение данных;
		$titleField - название столбца таблицы из БД, который нужно использовать в качестве заголовков строк;
		$valueField - значение для построения диограм.
	РЕЗУЛЬТАТ:
		Создаст диограму из данных базы*/
	function createFromSQLQuery($sql, $titleField, $valueField)
	{
		global $shavDB;

		if($sql == '')
		{
			$this->content = '<b class="error">Не запроса для выполнений</b>';
			return;
		}

		$results = $shavDB->get_results($sql);
		$this->dataValues = array();	//Очищаем массив значений, ось X
		$this->rowsTitle = array();		//Очищаем массив значений, ось У
		$array = array();				//Количество линий (графиков), из БД получается только один.
		$this->pointLabels = array();	//Очищаем подписи
		foreach($results as $rec)
		{
			$array[] = $rec[$valueField];
			$this->rowsTitle[] = str_replace(' ', '&nbsp;', $rec[$titleField]);
		}
		$this->maxValue = max($array);
		$this->dataValues[] = $array;

		if($this->isPracent == true)
		{
			foreach($array as $rec)
			{
				$prc = ($rec / ($this->maxValue+$this->korrection)) * 100;
				$this->pointLabels[] = number_format($prc, 2, ',', '').' %';
			}
		}

		$this->createContent();
	}

	/*Выводим содержимое диограммы
	ПАРАМЕТРЫ:
		$isDraw - вывести или вернуть html-код блока.
	РЕЗУЛЬТАТ:
		Выводится окно*/
	function drawDiogram($isDraw = false)
	{
		if($this->content == '')
			$this->createContent();
		
		if($isDraw == true)
			echo $this->content;
		else
			return $this->content;
	}

	/*Создаем контент будущей диограммы*/
	private function createContent()
	{
		//Создаем массивы данных
		$lines = '';
		$linesArr = '';
		$allLines = '';
		$i = 1;
		foreach($this->dataValues as $data)
		{
			$lines .= 'line'.$i.' = [';
			$k = 1;
			foreach($data as $value)
			{
				$lines .= '['.$value.', '.$k.'], ';
				$k++;
			}
			$allLines .= substr($lines, 0, strlen($lines)-2).'];';

			$linesArr .= 'line'.$i.', ';
			$i++;
		}

		$linesArr = substr($linesArr, 0, strlen($linesArr)-2);

		//Создаем легенду
		$series = 'series: [';
		foreach($this->labelLegends as $str)
		{
			$series .= '{label: \''.$str.'\'}, ';
		}
		$series = substr($series, 0, strlen($series)-2).']';

		//Создаем названия строк диограммы
		$rowsName = '[';
		foreach($this->rowsTitle as $titleRow)
		{
			$rowsName .= '\''.$titleRow.'\', ';
		}
		$rowsName = substr($rowsName, 0, strlen($rowsName)-2).']';

		//Создаем подписи
		if(!empty($this->pointLabels))
		{
			$pointLabels = 'labels:[';
			foreach($this->pointLabels as $lbl)
			{
				$pointLabels .= '\''.$lbl.'\', ';
			}
			$pointLabels = substr($pointLabels, 0, strlen($pointLabels)-2).'],';
		}
		else $pointLabels = '';
		
		//Настройка и вывод диограммы
		$this->content = "<script type=\"text/javascript\">
		$(document).ready(function(){
			".$allLines."
			plot_".$this->idDiagram." = $.jqplot('".$this->idDiagram."', [".$linesArr."], {
				seriesColors: [ \"#4bb2c5\", \"#c5b47f\", \"#EAA228\", \"#579575\", \"#839557\", \"#958c12\", \"#953579\", \"#4b5de4\", \"#d8b83f\", \"#ff5800\", \"#0085cc\"],
				stackSeries: true,
				legend: {
					show: false,
					location: '".$this->legendPos."'
				},
				grid:{
					background: 'rgba(255,255,255,0.0)',
					drawGridLines: false,
					borderColor: 'rgba(255,255,255,0.0)',
					borderWidth: 0,
					shadow: false
				},
				title: '".$this->title."',
				seriesDefaults: {
					renderer: $.jqplot.BarRenderer,
					rendererOptions: {
						barDirection: 'horizontal',
						barPadding: ".$this->paddingRow.",
						barMargin: ".$this->marginRow."
					},

					pointLabels:{
						".$pointLabels."
						ypadding:6,
						stackedValue: true
					}
				},
				$series,
				axes: {
					yaxis: {
						renderer: $.jqplot.CategoryAxisRenderer,
						ticks: ".$rowsName."
					},
					xaxis: {min: ".$this->minValue.", max: ".($this->maxValue+$this->korrection).", numberTicks:".$this->numberTicks.", showTickMarks: true}
				}
			});
		});
		</script>";

		$this->content .= '<div id="'.$this->idDiagram.'" style="'.$this->styleDiv.'"></div>';
	}
}
?>